home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
F2JW
/
trans
/
comp.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-22
|
6KB
|
248 lines
//
// フランス語 → 日本語 翻訳プログラム
//
// 形容詞、副詞 比較級 解析部
//
#include "stdafx.h"
#include <string.h>
#include <ctype.h>
#include "f2j.h"
#include "myprot.h"
extern TOKEN *currentTree;
extern ADVERB dic_adverb_NE;
extern ADVERB dic_adverb_Y;
extern ARTICLE articleTable[];
extern PRONOUN objectNounTable[];
extern BOOL isChanged;
extern JP_PREPOSITION dic_jpPreposition_DE[];
extern PRONOUN nullPronoun;
extern PREPOSITION dic_preposition_en_de;
//
// <Plus / Moins> + 形容詞/副詞 ->比較形容詞 / 副詞
//
void
CombinePlusAdjective(TOKEN *start)
{
TOKEN *p;
TOKEN *lastPlus = NULL;
for(p = start; p && p->next; p = p->next) {
TOKEN *next = p->next;
if((p->frPart == FR_PART_SPECIAL_PLUS
|| p->frPart == FR_PART_SPECIAL_MOINS
|| p->frPart == FR_PART_SPECIAL_AUSSI
|| p->frPart == FR_PART_SPECIAL_SI)
&& (IsObjectMatch(next, FR_PART_ADJECTIVE_GENERAL)
|| IsObjectMatch(next, FR_PART_ADVERB_GENERAL))
&& (next->frAttrib & FR_ATTRIB_COMPARE) == 0) {
lastPlus = p;
}
}
if(lastPlus == NULL) return;
TOKEN *adj = lastPlus->next;
DisconnectTOKEN(start, lastPlus);
FR_ATTRIB frAttrib;
switch(lastPlus->frPart) {
case FR_PART_SPECIAL_PLUS: frAttrib = FR_ATTRIB_PLUS; break;
case FR_PART_SPECIAL_MOINS: frAttrib = FR_ATTRIB_MOINS; break;
case FR_PART_SPECIAL_AUSSI: frAttrib = FR_ATTRIB_AUSSI; break;
case FR_PART_SPECIAL_SI: frAttrib = FR_ATTRIB_SI; break;
}
adj->frAttrib = (FR_ATTRIB)(adj->frAttrib | frAttrib);
}
BOOL
IsValue1(TOKEN *p)
{
return(p->value == 1);
}
BOOL
IsAttribPluralPlus(TOKEN *p)
{
if((p->frAttrib & FR_ATTRIB_PLURAL)
&& (p->frAttrib & FR_ATTRIB_PLUS))
return(TRUE);
else
return(FALSE);
}
CMP_TOKEN pat_OneOfTheMost[] = {
CMP_TOKEN( FR_PART_NUMETRIC_NUMBER, JP_PROP_NONE, IsValue1),
CMP_TOKEN( FR_PART_SPECIAL_DES, JP_PROP_NONE, NULL),
CMP_TOKEN( (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL),
JP_PROP_NONE, IsAttribPluralPlus ),
CMP_TOKEN(FR_PART_NONE)
};
//
// 定冠詞 + 比較形容詞 / 副詞 -> 最上級形容詞 / 副詞
//
void
CombineArticleAdjective(TOKEN *start)
{
TOKEN *p;
TOKEN *lastPlus = NULL;
for(p = start; p && p->next; p = p->next) {
TOKEN *next = p->next;
// le plus~, le moins~
if((IsObjectMatch(p, FR_PART_ARTICLE_DEFINIT)
|| IsObjectMatch(p, (FR_PART)(FR_PART_ADJECTIVE_DEMONSTRATIVE | FR_PART_ADJECTIVE_POSSESIVE)))
&& (next->frAttrib & (FR_ATTRIB)(FR_ATTRIB_PLUS | FR_ATTRIB_MOINS))) {
if(next->frAttrib & FR_ATTRIB_PLUS) next->frAttrib = FR_ATTRIB_LE_PLUS;
if(next->frAttrib & FR_ATTRIB_MOINS) next->frAttrib = FR_ATTRIB_LE_MOINS;
if(p->frPart & FR_PART_ARTICLE)
DisconnectTOKEN(start, p);
p = next;
}
// une des plus~, une des moins~
if(IsPatternMatch(pat_OneOfTheMost, p)) {
TOKEN *adj = p->next->next;
DisconnectTOKEN(start, p->next); // desを取り除く
DisconnectTOKEN(start, p); // uneを取り除く
adj->frAttrib = (FR_ATTRIB)(FR_ATTRIB_PLURAL
| FR_ATTRIB_ONE_OF_MOST
| (adj->frAttrib & FR_ATTRIB_BOTH_SEX));
p = next;
}
}
}
//
// 最低比較級を最高比較級に
// le moins 形容詞 -> le plus 形容詞
//
#if 1
BOOL
FlipCmpAdjective(TOKEN *parent, TOKEN *p)
{
FR_ATTRIB frAttrib = (FR_ATTRIB)(p->frAttrib & (FR_ATTRIB)(FR_ATTRIB_MOINS | FR_ATTRIB_LE_MOINS));
if(frAttrib == FR_ATTRIB_NONE
|| p->which == NULL) return(FALSE);
if((parent->frPart & FR_PART_VERB)
&& frAttrib == FR_ATTRIB_MOINS) {
if(parent->jpProp & JP_PROP_NEGATIVE) {
// Je ne suis pas moin {l{gante que Jean.
// 私はジャンより低度に上品でない。
// -> 私はジャンに劣らず上品だ。
parent->jpProp &= ~JP_PROP_NEGATIVE;
p->frAttrib = (FR_ATTRIB)(p->frAttrib & ~FR_ATTRIB_MOINS);
p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_NE_MOINS);
return(TRUE);
} else {
// Je suis moins gran Jean.
// 私はジャンより低度に高い。
// -> 私はジャンほど高くない。
parent->jpProp |= JP_PROP_NEGATIVE;
p->frAttrib = (FR_ATTRIB)(p->frAttrib & ~FR_ATTRIB_MOINS);
p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_SI);
return(TRUE);
}
}
if(FlipAdjective(p)) {
p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_LE_PLUS);
return(TRUE);
}
return(FALSE);
}
#else
BOOL
FlipCmpAdjective(TOKEN *p)
{
FR_ATTRIB frAttrib = (FR_ATTRIB)(p->frAttrib & (FR_ATTRIB)(FR_ATTRIB_MOINS | FR_ATTRIB_LE_MOINS));
if(frAttrib == FR_ATTRIB_NONE
|| p->which == NULL) return(FALSE);
if(FlipAdjective(p)) {
if(frAttrib & FR_ATTRIB_LE_MOINS)
p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_LE_PLUS);
else
p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_PLUS);
return(TRUE);
}
return(FALSE);
}
#endif
BOOL
FlipAdjective(TOKEN *p)
{
if(IsObjectMatch(p, FR_PART_ADJECTIVE_GENERAL)) {
JP_ADJECTIVE *jpAdj = (JP_ADJECTIVE *)p->which;
if(jpAdj->opposite) {
ChangeToAdjective(p, jpAdj->opposite);
return(TRUE);
}
} else if(IsObjectMatch(p, FR_PART_ADVERB_GENERAL)) {
JP_ADVERB *jpAdv = (JP_ADVERB *)p->which;
if(jpAdv->opposite) {
ChangeToAdverb(p, jpAdv->opposite);
return(TRUE);
}
}
return(FALSE);
}
BOOL
IsTokenNumFois(TOKEN *p)
{
NOUN *noun = (NOUN *)p->what;
if(p->frPart == FR_PART_NOUN_GENERAL
&& !strcmp(noun->french, "fois")
&& SearchToken(FR_PART_NUMETRIC_NUMBER, p->child))
return(TRUE);
return(FALSE);
}
BOOL
IsTokenCompare(TOKEN *p)
{
if(p->frAttrib & (FR_ATTRIB)(FR_ATTRIB_PLUS | FR_ATTRIB_MOINS))
return(TRUE);
else
return(FALSE);
}
CMP_TOKEN pat_NumFoisAdj[] = {
// elle est cinq fois plus belle,
CMP_TOKEN( FR_PART_NOUN_GENERAL, JP_PROP_UNIT, IsTokenNumFois),
CMP_TOKEN( (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL),
JP_PROP_NONE, IsTokenCompare),
CMP_TOKEN( FR_PART_NONE)
};
//
// 数値 + fois + 比較形容詞/副詞
//
void
CombineNumFoisAdjective(TOKEN *start)
{
TOKEN *p;
for(p = start; p; p = p->next) {
if(IsPatternMatch(pat_NumFoisAdj, p)) {
DisconnectTOKEN(start, p->next); // "fois"
DisconnectTOKEN(start, p); // number
}
}
}